const merge_ = function (intervals) {
  if (intervals == null || intervals.length === 0) return []

  // 按照第一位排序或第二位排序
  intervals.sort((a, b) => (a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]))

  const res = [intervals[0]]
  for (let i = 1, n = intervals.length; i < n; i++) {
    // 上一个区间
    const last = res[res.length - 1]
    // 上一个区间的第二位
    const lastEnd = last[1]

    // 当前区间的 第一位、第二位
    const [s, e] = intervals[i]

    // 比较 当前区间第一位 和 上一个区间第二位
    // 如果 大于
    if (s > lastEnd) {
      // 说明区间没有重叠 直接将 当前区间 塞入 结果数组
      res.push(intervals[i])
    } else {
      // 如果 小于等于 说明，区间有重叠，合并区间
      // 注意 上一个区间的 第二位 可能 大于 当前区间的 第二位
      last[1] = Math.max(last[1], e)
    }
  }

  return res
}

const merge = function (intervals) {
  // 处理下边界
  if (!Array.isArray(intervals) || !intervals.length) {
    return []
  }

  // 排序下
  intervals.sort((a, b) => (a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]))

  // 返回结果 先装入第一个区间
  const res = [intervals[0]]

  const getLastInterval = () => res[res.length - 1]
  const intervalsLen = intervals.length

  // 开始遍历区间
  for (let i = 1; i < intervalsLen; i++) {
    // 最后一个区间
    let last = getLastInterval()
    let lastR = last[1]

    // 当前区间
    const [l, r] = intervals[i]

    // 对比
    if (lastR < l) {
      res.push(intervals[i])
    } else {
      last[1] = Math.max(lastR, r)
    }
  }

  return res
}

console.log(
  merge_([
    [1, 3],
    [2, 6],
    [8, 10],
    [15, 18]
  ])
)
console.log(
  merge([
    [1, 3],
    [2, 6],
    [8, 10],
    [15, 18]
  ])
)
